/*
  2. 找出一个二维数组中的鞍点，即该位置上的元素在该行上最大，在该列上最小（也可能没有鞍点）�?

  例如运行结果（以符号å结尾的数据表示是键盘输入的）:

  1 2 3 4 5å (输入4�?5列数�?)

  2 4 6 8 10å

  3 6 9 12 15å

  4 8 12 16 20å

  A[0][4]=5 （输�?0�?4列是鞍点，值为5�?

  1 12 3 4 5å (输入4�?5列数�?)

  2 4 16 8 10å

  3 6 9 12 15å

  4 8 12 16 20å

  不存在鞍点 (输出无鞍点)
*/
#include <iostream>
#include <string.h>
using namespace std;

int main(int argc, char const *argv[])
{

  // int arr[4][5] = {
  //     {1, 2, 3, 4, 5},
  //     {2, 4, 6, 8, 10},
  //     {3, 6, 9, 12, 15},
  //     {4, 8, 12, 16, 20}};

  // 数组
  int arr[4][5];

  // 每行最大值的 X 坐标
  int rx[4];

  // 每行最大值的 Y 坐标
  int ry[4];

  // 每列最小值的 X 坐标
  int cx[5];

  // 每列最小值的 Y 坐标
  int cy[5];
  
  // 是否有鞍点
  bool flag = true;

  // 从控制台读取数据存储到数组里面
  printf("输入 4 行 5 列数据：\n");
  for (int i = 0; i < 1; i++)
  {
    printf("第 %d 行：", i + 1);
    scanf("%d", &arr[i][0]);
    scanf("%d", &arr[i][1]);
    scanf("%d", &arr[i][2]);
    scanf("%d", &arr[i][3]);
    scanf("%d", &arr[i][4]);
  }

  // 算出每行的最大值，存储行和列的索引
  // 基于行进行遍历
  for (int i = 0; i < 4; i++)
  {
    int max = 0;
    rx[i] = 0;
    ry[i] = 0;

    for (int j = 0; j < 5; j++)
    {
      if (max < arr[i][j])
      {
        max = arr[i][j];
        rx[i] = i;
        ry[i] = j;
      }
    }
  }

  // 算出每列的最小值，存储行和列的索引
  // 基于列进行遍历
  for (int i = 0; i < 5; i++)
  {
    int min = 10000000;
    cx[i] = 0;
    cy[i] = 0;

    for (int j = 0; j < 4; j++)
    {

      if (min > arr[j][i])
      {
        min = arr[j][i];
        cx[i] = j;
        cy[i] = i;
      }
    }
  }

  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 5; j++)
    {
      if (rx[i] == cx[j] && ry[i] == cy[j])
      {
        // 当坐标相同时输出鞍点坐标
        printf("%d 行 %d 列是鞍点，值为：%d", rx[i] + 1, ry[i] + 1, arr[i][j]);
        flag = false;
      }
    }

  if (flag)
  {
    printf("无鞍点");
  }

  return 0;
}
